package hos.location;

import android.app.Activity;
import android.content.Context;
import android.location.Address;

import java.io.IOException;
import java.util.List;


/**
 * <p>Title: LocationSourceListener </p>
 * <p>Description:  </p>
 * <p>Company: www.mapuni.com </p>
 *
 * @author : 蔡俊峰
 * @version : 1.0
 * @date : 2020/10/18 23:27
 */
public interface LocationSourceListener {

    void setHasAddress(boolean hasAddress);
    /**
     * 打开缓存
     */
    void openCache();

    /**
     * 关闭缓存
     */
    void closeCache();

    /**
     * 获取上下文
     *
     * @return 上下文
     */
    Context getContext();

    /**
     * 清除定位信息
     */
    void clearLocationInfo();

    /**
     * 判断定位是否可以使用
     */
    boolean isLocationEnabled();

    /**
     * 设置定位场景
     *
     * @param locationPurpose 定位场景  SignIn 签到场景  Sport 出行场景 Transport 运动场景
     * @return
     */
    LocationSourceListener setLocationPurpose(LocationPurpose locationPurpose);

    /**
     * 设置定位场景并启动定位
     *
     * @param locationPurpose 定位场景  SignIn 签到场景  Sport 出行场景 Transport 运动场景
     */
    void locationPurposeStart(LocationPurpose locationPurpose);

    /**
     * 添加定位信息变化监听
     *
     * @param listener 监听事件
     */
    void addLocationChangedListener(final LocationChangedListener listener);

    /**
     * 移除定位信息变化监听
     *
     * @param listener 监听事件
     */
    void removeLocationChangedListener(LocationChangedListener listener);

    /**
     * 添加定位状态发生改变监听
     *
     * @param listener 监听事件
     */
    void addStatusChangedListener(final LocationStatusChangedListener listener);

    /**
     * 移除定位状态发生改变监听
     *
     * @param listener 监听事件
     */
    void removeStatusChangedListener(LocationStatusChangedListener listener);

    /**
     * 添加传感器发生变化监听事件
     *
     * @param listener 监听事件
     */
    void addHeadingChangedListener(final LocationHeadingChangedListener listener);

    /**
     * 移除传感器发生变化监听事件
     *
     * @param listener 监听事件
     */
    void removeHeadingChangedListener(final LocationHeadingChangedListener listener);

    /**
     * 获取定位错误信息
     *
     * @return 错误信息
     */
    Throwable getError();

    /**
     * 获取一次性定位信息
     *
     * @param locationOnceListener 一次性定位监听
     */
    void getOnceLocation(LocationOnceListener locationOnceListener);

    /**
     * 获取定位信息
     *
     * @return
     */
    LocationData getLocation();

    /**
     * 获取最近一次定位信息
     *
     * @return
     */
    LocationData getLastKnownLocation();
    /**
     * 获取地址信息
     *
     * @return 地址信息
     */
    List<Address> getAddress() throws IOException;
    /**
     * 获取地址信息
     *
     * @param locationData 定位信息
     * @return 地址信息
     */
    List<Address> getAddress(LocationData locationData) throws IOException;
    /**
     * 本次经纬度和上一次经纬度是否重复
     *
     * @return true 重复
     */

    boolean isLatLngRepeated();

    /**
     * 更新定位信息
     *
     * @param location 定位信息
     */
    void updateLocation(final LocationData location);

    /**
     * 更新定位信息
     */
    void notifyLocation();

    /**
     * 重新启动定位
     */
    void restartLocation();

    /**
     * 启动定位
     */
    void startLocation();

    /**
     * 停止定位
     */
    void stopLocation();

    /**
     * 关闭定位
     */
    void closeLocation();

    /**
     * 启动前台服务定位 （原生定位未实现）
     *
     * @param activity 当前的活动页面
     */
    void startForegroundLocation(Activity activity);

    /**
     * 停止前台服务定位 （原生定位未实现）
     */
    void stopForegroundLocation();

}
